package com.tedu.api.list;

import org.junit.Test;

import java.util.*;



/**
 * List子接口---两个实现类
 * ArrayList实现类：数组实现---查询快，，增删慢---使用集合【查询效率高】
 * <p>
 * 链表实现集合
 * LinkedList实现类：双向链表实现---查询慢，增删快--【元素增删操作多】
 * <p>
 * ArrayList实现类与LinkList实现类大部分方法完全一致
 * 添加add（）    删除remove（）    获取get（）
 * 获取集合长度size（）     清空集合clear（）
 * -----------------------------------------
 * ArrayList实现类与LinkList方法不一致的
 * 方法补充：    indexOf()       lastIndexOf（）
 * addFirst（E e）
 * addFast（E e）
 * removeFirst（）
 * removeFast（）
 */

        public class LinkedListAPI {
            /**
             * ArrayList/ LinkedList        LinkedList
             * 方法补充：    indexOf()       lastIndexOf（）
             */
            @Test
            public void testIndexOf() {
                //创建LinkedList双向链接集合对象
                List<String> listlinked = new LinkedList<>();
                listlinked.add("三吱");
                listlinked.add("龙虎斗");
                listlinked.add("庵汤");
                listlinked.add("螺狮粉");
                /**
                 * 补充方法：
                 * List子接口的方法----ArrayList
                 * indexOf()    返回值：int
                 * 作用：返回元素指定下标位，，如果找不到，，返回-1
                 */
                int threeIndex = listlinked.indexOf("庵汤");
                //调用父级List的indexOf方法      多态
                System.out.println("通过指定元素获取下标位：" + threeIndex);
                /**LinkedList独有方法
                 * LastIndexOf（E e）        返回值：int
                 * 作用：找到最后一个元素的位置，，如果元素不存在返回-1
                 */
                int lastIndex = listlinked.lastIndexOf("螺狮粉");
                //调用子类实现类LastIndexOf方法
                System.out.println("LinkedList的查找最后一个元素下标位：" + lastIndex);
            }

            /**
             * addFirst（E e）          返回值：void
             * 作用：将指定元素添加链表尾部
             * addFast（E e）           返回值：void
             * 作用：将指定元素添加链表尾部
             * removeFirst（）          返回值：void
             * 作用：移除并返回链接的第一个元素，如果链表为空，抛出异常
             * NoSuchElementException   没有这个元素异常
             * removeFast（）           返回值：void
             * 作用：移除并返回链接的最后一个元素，如果链表为空，抛出异常
             * NoSuchElementException   没有这个元素异常
             */
            @Test
            public void testLinkedList() {
                //创建集合对象：使用多态调用父类/【子类的重写父类的方法】
                List<String> list = new LinkedList<>();
                list.add("熊猫计划");
                list.add("749局");
                list.add("欲火之路");
                //子类-LinkedList没有重写父类-List的方法
                //多态---

                卧底:
//多态----向下造型 ((LinkedList)list)  将list对象强转子类LinkedList
                ((LinkedList) list).addFirst("抓娃娃");
                ((LinkedList) list).addFirst("志愿军");
                System.out.println("LinkedList集合打印：" + list);
                //需求：遍历LinkedList集合----Iterator迭代器
                //1.依赖Collection集合---子集合接口
                Iterator<String> it = list.iterator();
                //2.循环遍历，，Iterator迭代器：问   取   删     【删，，选择使用】
                while (it.hasNext()) {
                    //问：集合有元素
                    String str = it.next();   //取：获取集合元素
                    System.out.println("迭代器支持Collection接口下所有类：" + str);
                }
                //需求：删除LinkedList集合元素中：抓娃娃元素
                list.clear();
                ((LinkedList) list).removeFirst();
                System.out.println("使用链表集合删除第一个元素：" + list);
            }

        }


